/*
 【入门】括号匹配
  题目描述
    输入一个由 ()[] 四种符号构成的字符串。
    判断其中的括号是否匹配，是，就输出 yes，否则输出 no。
    比如：输入“([])”、“([()])”、“[((()))]”、“()[][][]()[]” 这几个字符串（双引号内部的内容），我们都算是匹配的。
    再比如：输入“([)”、“([)]”、“([(]))” 这几个字符串，我们都认为是不匹配的。
  输入
    一个由 ()[] 四种符号构成的字符串
  输出
    如果匹配，请输出 yes，如果不匹配，请输出 no
  样例输入
    ([])
  样例输出
    yes
*/

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;

    cin >> s;

    /*
      思路:
        如果字符串 s 长度为奇数, 则一定不匹配!
        否则 (即字符串 s 长度为偶数) 进行如下处理:
          从左向右遍历整个字符串
            当发现字符为左括号 '[' 或 '(' 时, 将该字符串进栈;
            否则 (即字符为右括号 ']' 或 ')' 时) 进行如下处理:
              如果栈为空, 则不匹配;
              否则 (即栈不为空) 进行如下处理:
                如果栈顶的字符为对应的左括号 '[' 或 '('时, 将栈顶字符出栈；
                否则, 不匹配.
          遍历万字符串后, 检查站是否为空
            如果栈不为空，则不匹配；
            否则，匹配
    */
    if (s.size() % 2 != 0) {
        cout << "no";
        return 0;
    } else {
        stack <char>  sta;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(' || s[i] == '[') {
                sta.push(s[i]);
            } else {
                if (sta.empty()) {
                    cout << "no";
                    return 0;
                } else {
                    if ((s[i] == ')' && sta.top() == '(') ||
                        (s[i] == ']' && sta.top() == '[') ) {
                        sta.pop();
                    } else {
                        cout << "no";
                        return 0;
                    }
                }
            }
        }

        if (sta.empty()) {
            cout << "yes";
        } else {
            cout << "no";
        }
    }

    return 0;
}